package model

import (
	"time"
)

type Post struct {
	Pid          uint64    `gorm:"primary_key;auto_increment" json:"pid"`
	UserId       uint64    `gorm:"column:uid;not null" json:"uid" binding:"required" form:"uid"`
	Title        string    `gorm:"column:title;not null" json:"title"`
	Brief        string    `gorm:"column:brief;not null" json:"brief" binding:"required" form:"brief" validate:"vali_brief"`
	Content      string    `gorm:"column:content;not null" json:"content"`
	LikeCount    uint64    `gorm:"column:likecount;not null;default:0" json:"likecount"`
	CollectCount uint64    `gorm:"column:collectcount;not null;default:0" json:"collectcount"`
	ImageURL     string    `gorm:"column:imageurl;not null" json:"imageurl" binding:"required"`
	CreateAt     time.Time `gorm:"column:created_at" json:"create_at"`
	Updated      time.Time `gorm:"column:updated_at" json:"updated_at"`
	//添加对User表的关系查询字段
	Writer  UserInfoModel `gorm:"foreignkey:UserId" binding:"-"`
	Types   []PostType    `gorm:"many2many:post_type_maps" binding:"-"`
	Comment []Comment     `gorm:"foreignkey:Pid" binding:"-"`
	//收藏该post的用户列表
	UserCollect []UserInfoModel `gorm:"many2many:collects;foreignKey:Pid"  binding:"-"`
}

// 通过post找收藏用户
func (p *Post) GetUserCollectByPost() error {
	return DB.Self.Preload("UserCollect").First(&p).Error
}

// 通过post找类型
func (a *Post) GetTypeByPost() error {
	return DB.Self.Preload("Types").First(&a).Error
}

// 查询所有帖子
func GetPost() ([]*Post, error) {
	posts := make([]*Post, 0)
	err := DB.Self.Find(&posts).Error
	return posts, err
}

// 根据关键字查帖子（标题，简介，内容）
func GetPostByKey(kw string) ([]*Post, error) {
	posts := make([]*Post, 0)
	err := DB.Self.Where("title like ? or brief like ? or content like ? ", "%"+kw+"%", "%"+kw+"%", "%"+kw+"%").Find(&posts).Error
	return posts, err
}

// 根据pid查帖子
func GetPostByPid(id uint64) (*Post, error) {
	p := &Post{}
	//r:=DB.Self.First(s,id)//根据主键，主键是整数类型去查询
	r := DB.Self.Where("pid=?", id).First(p)
	return p, r.Error
}

func GetPostByPidC(pid uint64, post *Post) error {
	return DB.Self.Where("pid = ?", pid).First(post).Error
}

// 根据post找帖主
func (p *Post) GetWriterByPost() error {
	return DB.Self.Preload("Writer").First(&p).Error
}

// 根据post找评论
func (p *Post) GetCommentByPost() error {
	return DB.Self.Preload("Comment").First(&p).Error
}

// 新增post
func (p *Post) Create() error {
	return DB.Self.Create(&p).Error
}

// 删除post（默认根据Post结构体实例p中定义主键来删，如果未定义主键，则删不了）
func (p *Post) Delete() error {
	return DB.Self.Delete(&p).Error
}

////根据某字段来删，而不仅仅依赖主键
//func (p *Post) Delete() error {
//	// 显式指定删除条件：WHERE pid = p.Pid
//	return DB.Self.Where("pid = ?", p.Pid).Delete(&Post{}).Error
//}

// 修改商品信息
func (p *Post) Update() error {
	return DB.Self.Model(&p).Update(&p).Error
}
